
package empregados;

import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author Carlos Eduardo
 * Classe responsável por selecionar o tipo correto do empregado, de acordo
 * com a idade, sexo e salário informados, e criar o objeto correto
 */
public class EmpregadoFactory {
    
    private static Integer calculaIdade(Date dt_nascimento, Date dt_atual) {  
        Calendar dataNascimento = Calendar.getInstance();  
        dataNascimento.setTime(dt_nascimento);  
        Calendar dataAtual = Calendar.getInstance();
        dataAtual.setTime(dt_atual);

        Integer diferencaMes = dataAtual.get(Calendar.MONTH) - dataNascimento.get(Calendar.MONTH);  
        Integer diferencaDia = dataAtual.get(Calendar.DAY_OF_MONTH) - dataNascimento.get(Calendar.DAY_OF_MONTH);  
        Integer idade = (dataAtual.get(Calendar.YEAR) - dataNascimento.get(Calendar.YEAR));  

        if(diferencaMes < 0  || (diferencaMes == 0 && diferencaDia < 0)) {  
            idade--;  
    }  
      
    return idade;  
} 
    
    public static Empregado criaEmpregado(String cpf, String nome, String sexo, Date dt_nascimento, Date dt_admissao, double salario_atual, Date dt_desligamento, Date dt_atual) throws Exception {
        
        // Validações necessárias (campos SEXO e IDADE) para identificação da classe correspondente
        if (sexo==null) { throw new Exception("O campo Sexo é obrigatório."); }
        if ((!"M".equals(sexo.toUpperCase())) && (!"F".equals(sexo.toUpperCase()))) { throw new Exception("Sexo inválido. Os valores válidos são M ou F."); }
        if (dt_nascimento==null) { throw new Exception("O campo Data de Nascimento é obrigatório."); }
        if (dt_nascimento.after(new Date())) { throw new Exception("A data de nascimento não pode ser posterior à data atual."); }

        int idade = calculaIdade(dt_nascimento, dt_atual);
        
        if (sexo=="M" || sexo=="m") {
            if(idade>=21 && idade <=35) {
                if (salario_atual <= 5000.0) {
                    return new Homem21a35_menor_igual_5000(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }
                else {
                    return new Homem21a35_maior_5000(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }   
            }
            
            if(idade>=36 && idade <=45) {
                if (salario_atual <= 6000.0) {
                    return new Homem36a45_menor_igual_6000(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }
                else {
                    return new Homem36a45_maior_6000(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }   
            }
            
            if(idade>=46 && idade <=65) {
                return new Homem46a65(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
            }
        } else {
            if (sexo=="F" || sexo=="f") {
                if(idade>=21 && idade <=30) {
                    return new Mulher21a30(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }            

                if(idade>=31 && idade <=44) {
                    return new Mulher31a44(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }            

                if(idade>=45 && idade <=61) {
                    return new Mulher45a61(cpf, nome, sexo, dt_nascimento, dt_admissao, salario_atual, dt_desligamento);
                }
            } else {
               throw new Exception("Idade não permitida.");
            }
        }
    
        return null;
    }
}
